基于 OpenSSH 的身份认证与密钥管理

您所在的位置:网站首页 opensshwindows电脑服务端 密钥认证不匹配 基于 OpenSSH 的身份认证与密钥管理

基于 OpenSSH 的身份认证与密钥管理

2024-07-16 11:34| 来源: 网络整理| 查看: 265

文章目录 1. SSH KEY1.1 SSH密钥是一个认证凭证1.1.1 授权密钥(Authorized Key)1.1.1 身份密钥(Identity Key)1.1.3 基于证书的用户认证 1.2 设备认证密钥1.2.1 主机密钥认证服务1.2.2 已知主机密钥(Known Host Keys) 1.3 会话密钥(Session Keys)1.4 配置基于密钥的身份认证1.4.1 为OpenSSH设置公钥身份认证1.4.2 在SSH-Agent中存储用于单点登录的密钥1.4.3 建议的密钥大小1.4.4 身份密钥的位置1.4.5 授权密钥的位置1.4.6 将SSH密钥移动到属于ROOT账户的位置1.4.7 OpenSSH在密钥数量上的限制 1.5 SSH 密钥是怎么样的1.6 SSH中的认证机制是怎样工作的1.6.1 公钥认证 1.7 如何完全彻底删除SSH密钥 2. SSH-KEYGEN2.1 SSH 密钥和公钥身份认证2.2 创建用于身份认证的 SSH 密钥对2.2.1 选择加密算法和密钥长度2.2.2 指定文件名 2.3 将公钥复制到服务器2.4 将密钥添加到 SSH 代理2.5 生成主机密钥2.6 使用X.509证书进行主机身份验证2.7 使用OpenSSH的专有证书

1. SSH KEY

SSH key ,又叫 SSH 密钥,是SSH协议中的访问凭证。它的功能类似于用户名和密码,但主要用于自动化流程以及实现系统管理员和高级用户的单点登录。

1.1 SSH密钥是一个认证凭证

SSH(Secure Shell)用于管理网络、操作系统和配置,被广泛应用于许多文件传输工具和配置管理工具中。

功能上SSH密钥类似于密码。它们授予访问权限并控制谁可以访问什么。在 身份和访问管理 中,与用户帐户和密码一样,它们需要类似的策略、启用和终止。如果不控制SSH密钥,就不能保证系统的机密性、完整性或任何持续可用性。

从技术上讲,密钥是使用公钥密码系统的加密密钥。但是,从功能上讲,它们是身份验证凭证。

1.1.1 授权密钥(Authorized Key)

授权密钥是用于授予权限的公钥。它定义谁可以访问系统。类似于对应的私钥可以打开的锁。

1.1.1 身份密钥(Identity Key)

身份密钥是SSH客户端在登录SSH服务器时用于鉴定自身的私钥。它们类似于物理密钥,可以打开一个或多个锁。

授权密钥和身份密钥联合起来被称为用户密钥,用于用户认证。

1.1.3 基于证书的用户认证

PKI证书也可以用于用户认证。在这种情况下,用户有一个私钥和与这个私钥关联的证书。Tectia SSH 和 OpenSSH 都支持基于证书的用于认证,但是又一些不同之处。要了解详细情况,请参考 SSH中基于证书的认证 。

1.2 设备认证密钥 1.2.1 主机密钥认证服务

主机密钥用于对主机进行身份认证,例如,电脑。主机密钥认证的目的是防止中间人攻击。相关信息,请参见 主机密钥 。

在大型组织中,基于证书的主机身份验证是一种非常有吸引力的替代方法。它允许方便地管理设备身份验证密钥,并保护每个连接。

1.2.2 已知主机密钥(Known Host Keys)

SSH的一个独特特性是,默认情况下,它在第一次连接到主机的密钥时会信任并记住它。这是允许SSH部署在底层的一个关键区别,因为在1995年,主机没有集中的密钥基础设施,直到今天(2017年)仍然没有,web服务器也没有SSL证书。因此易于部署是SSH成功的主要原因之一。

所记忆的主机密钥称为已知主机密钥,它们存储在OpenSSH中名为 known_hosts 的文件中。只要主机密钥不变,这个应用程序就非常容易使用,并且提供了相当好的安全性。然而,在大型组织中,当密钥发生更改时,维护已知的主机文件可能会非常耗时。在这种情况下,建议对主机密钥使用证书。Tectia SSH支持主机的标准X.509证书。OpenSSH有自己的专有证书格式。基于标准的证书的优点是,它们可以由任何证书颁发机构(CA)颁发,而OpenSSH密钥没有可靠的CA。相关信息,请参见 带有证书的SSH。

1.3 会话密钥(Session Keys)

SSH中的会话密钥是用于加密连接中的大多数数据的加密密钥。会话密钥在连接期间协商,然后与对称加密算法和消息身份验证代码算法一起使用,以保护数据。详细信息,请参见 会话密钥 。

1.4 配置基于密钥的身份认证

SSH中基于密钥的身份验证称为公钥身份验证。很容易由最终用户在默认配置中配置。另一方面,具有安全意识的组织需要为提供和终止基于密钥的访问建立清晰的策略。

1.4.1 为OpenSSH设置公钥身份认证

SSH密钥通常配置在用户主目录下的 .ssh 子目录中的 authorized_keys 文件中。通常,系统管理员首先使用 ssh-keygen 创建密钥,然后使用 ssh-copy-id 工具将其作为授权密钥安装在服务器上。详细信息,请参阅 为OpenSSH配置授权密钥 。

我们建议对所有用于交互访问的身份密钥使用密码(passphrases)。原则上,我们也建议使用密码进行自动访问,但这通常不实用。

1.4.2 在SSH-Agent中存储用于单点登录的密钥

SSH附带一个名为 ssh-agent 的程序,该程序可以在内存中保存用户解密的私钥,并使用它们对登录进行身份验证。代理还可以用于访问智能卡或硬件安全模块(HSM)上的密钥。有关如何设置 ssh-agent,请参阅 配置ssh-agent。

可以将到SSH代理的连接转发到服务器,这样单点登录也可以从该服务器继续工作。应该谨慎使用该特性,因为它允许受影响的服务器使用来自原始代理的用户凭证。然而,对于安全性不那么关键的环境中的高级用户来说,代理转发可能是一个主要的便利特性。

要启用代理转发,请在服务器上的 /etc/ssh/sshd_config 中将 AllowAgentForwarding 设置为 yes,在客户机配置文件 /etc/ssh/ssh_config 中将 ForwardAgent 设置为 yes。

1.4.3 建议的密钥大小

建议根据 NIST SP 800-57 选择密钥大小。ssh-keygen 工具使用的默认密钥大小通常具有可接受的强度。事实上,由于协议从未公开用户身份验证可接受的公钥,所以用于密钥的算法并不像在PKI证书中那样重要。

对于RSA密钥,2048位在今天(2017年)可能是一个不错的选择。然而,许多密码学家现在建议改用ECDSA密钥,并认为分解大整数的进展可能会使RSA密钥在近/中期变得脆弱。对于ECDSA,尽管384位或256位密钥可能是安全的,但是还是建议使用521位(sic!)密钥。使用较小的密钥没有实际的好处。

1.4.4 身份密钥的位置

身份密钥通常存储在用户主目录下的 .ssh 子目录中,例如 .ssh/ssh_id_rsa 或 .ssh/id_rsa。默认的身份密钥文件名一般以 id_ 开始,但是,在创建私钥时可以为私钥指定任意的名称和存储位置,并在使用SSH客户端进行连接时使用 -i 选项指定私钥的存储位置。例如,ssh -i /home/ylo/secure/my-key [email protected] 将使用文件 my-key 中的私钥进行身份验证。

默认的身份密钥位置也可以在 /etc/ssh/ssh_config 中配置,或者使用 IdentityFile 选项在用户的 .ssh/config 文件中配置。

1.4.5 授权密钥的位置

当用户尝试使用基于密钥的身份验证登录时,OpenSSH服务器使用 AuthorizedKeysFile 选项从服务器配置中指定的目录中查找授权密钥。默认值是用户主目录中的 .ssh/authorized_keys。

然而,将授权密钥存储在用户的主目录中意味着用户可以添加新的密钥来授权登录到他/她的帐户。这很方便,但是用户可以把这些密钥给朋友或同事,甚至进行售卖。SSH密钥是永久的,并且在明确删除之前一直有效。

如果为root帐户或services帐户添加了授权密钥,即使安装密钥的人离开了组织,密钥也还是有效的。如果没有关于未经授权的新密钥的检测和警报,黑客很容易基于此来持久地访问服务器。

由于这些原因,大多数较大的组织都希望将授权密钥移动到属于root账户的位置,并为它们建立 受控的访问和终止策略。

1.4.6 将SSH密钥移动到属于ROOT账户的位置

原则上,将SSH密钥移动到属于root账户的位置非常容易:

创建一个属主为root的目录,例如 /etc/ssh/keys,在该位置下存储授权密钥。在该目录下为每个用户创建一个以用户名命名的子目录,并将每个用户的授权密钥移动到名称为该用户的用户名的子目录下的 authorized_keys 文件中,即 /etc/ssh/keys//authorized_keys。更改 /etc/ssh/sshd_config 文件中的 AuthorizedKeysFile 的值为 /etc/ssh/keys/%u/authorized_keys。

然而,在实践中,这并不总是那么简单,特别是在较大的环境中。用户名可能来自目录(例如,Active Directory或LDAP)。许多组织都有不同的OpenSSH版本,包括非常旧的系统或具有非标准内置路径的自定义SSH构建。我们建议使用诸如 通用SSH密钥管理器 之类的密钥管理工具在更大的环境中隐藏这种复杂性。这些工具还可以实现密钥的供应、终止和批准工作流,以及关于root用户进行的未授权更改的警报。

1.4.7 OpenSSH在密钥数量上的限制

OpenSSH服务器有一个特性(我称之为bug):测试一个特定的密钥是否可以用作身份验证将被当作进行一次身份验证的尝试,而测试会被计数。其结果是,如果用户在 .ssh 目录中有5个以上的密钥,而其中只有一些密钥可以工作,这可能会导致基于密钥的身份验证因为尝试的次数过多且没有找到可以工作的密钥而失败,而且用户往往难以找出问题所在。解决这个问题的方法是使用 -i 选项显式指定要使用的私钥。另一种方法是调整服务器上的 MaxAuthTries 会话,但这不是一个完整的解决方案,因为增加密码(password)验证的尝试次数是不可取的。

1.5 SSH 密钥是怎么样的

一个授权密钥一般是这样子的:

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBN+Mh3U/3We4VYtV1QmWUFIzFLTUeegl1Ao5/QGtCRGAZn8bxX9KlCrrWISIjSYAwCajIEGSPEZwPNMBoK8XD8Q= ylo@klar

一个身份密钥一般是这样子的:

-----BEGIN EC PRIVATE KEY----- MHcCAQEEIJWbvSW7h50HPwG+bWR3DXgQ6YhOxYbe0ifr1rRUvsUuoAoGCCqGSM49 AwEHoUQDQgAE34yHdT/dZ7hVi1XVCZZQUjMUtNR56CXUCjn9Aa0JEYBmfxvFf0qU KutYhIiNJgDAJqMgQZI8RnA80wGgrxcPxA== -----END EC PRIVATE KEY----- 1.6 SSH中的认证机制是怎样工作的

在SSH中初始化连接包括:

协商使用的协议版本协商要使用的密码算法和其他选项协商用于加密会话其余部分的一次性会话密钥使用其主机密钥对服务器进行身份验证使用密码、公钥认证或其他方法对用户进行身份验证

之后,便可以交换数据,包括终端数据、图形和文件。

在这里插入图片描述

1.6.1 公钥认证

SSH中基于密钥的身份验证机制称为公钥身份验证。本质上,一些特定于会话的数据是使用身份密钥(私钥)签名的。然后将签名发送到服务器,服务器将检查用于签名的密钥是否配置为授权密钥。然后,服务器使用授权密钥中的公钥验证数字签名。身份密钥永远不会发送到服务器。

公钥身份验证的关键是它允许一个服务器访问另一个服务器,而不需要输入密码。这个强大的特性是它被广泛用于文件传输(使用SFTP协议)和配置管理的原因。系统管理员还经常使用它进行单点登录。

1.7 如何完全彻底删除SSH密钥

PrivX On-Demand Access Manager 可用于完全从服务器中删除SSH密钥,并在整个企业中建立基于策略的访问控制和会话日志记录。它还消除了管理密钥的大部分管理负担,同时仍然提供了好处:自动化和单点登录。

2. SSH-KEYGEN

ssh-keygen 是一个用来为 SSH 创建新的身份验证密钥对的工具。这些密钥可用来进行自动登录、单点登录或者验证主机。

2.1 SSH 密钥和公钥身份认证

SSH 协议使用公钥加密体制对主机和用户进行身份验证。身份验证密钥(称为 SSH 密钥)是使用 keygen 程序创建的。

SSH 引入了公钥身份认证,作为较旧的 rhosts 身份验证更安全的替代方案。它通过避免将密码存储在文件中来提高安全性,并消除了受到攻击的服务器窃取用户密码的可能性。

但是,SSH 密钥和密码一样是身份验证凭证。因此,必须对他们进行类似于用户名和密码的管理。他们应该有一个适当的终止过程,以便在不需要时删除密钥。

2.2 创建用于身份认证的 SSH 密钥对

生成一个密钥对的最简单方法是以无参数的形式运行 ssh-keygen 命令。在这种情况下,它会提示用户输入用于存储密钥的文件的路径和名称。下面是一个例子:

$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/bob/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/bob/.ssh/id_rsa. Your public key has been saved in /Users/bob/.ssh/id_rsa.pub. The key fingerprint is: SHA256:iMDQ3fPqeW8amyBpmnU47C+8KkjEU4eY5m/8uMr3SZ4 bob@local The key's randomart image is: +---[RSA 2048]----+ |..o... | | *.o..o | |+ + . o | | = . . .. | |. + . ..S | | . = o. | |o ..@oo.. | |+ O===..+. | | +*o=E..++. | +----[SHA256]-----+

首先,程序会询问要将密钥保存到什么地方的什么文件中。用于用户身份验证的 SSH 密钥通常存储在用户主目录下的 .ssh 文件夹中。然而,在企业环境中,通常会存储到其他位置。默认的密钥名称依赖于使用的加密算法。在上面的例子中,由于未加任何参数,所以默认使用了 RSA 算法,所以,密钥的名称是 id_rsa。密钥的名称也可以是 id_dsa 或者 id_ecdsa。

然后,程序会要求输入一个密码(passphrase)。这个密码用来加密密钥,因此,即使其他人获得了私钥文件,他也不能使用密钥它。密码应该是一个强密码。可以使用 在线随机密码生成器 来生成强密码。

2.2.1 选择加密算法和密钥长度

SSH 支持多种用于身份验证密钥的公钥算法。它们包括:

rsa 一种基于大数分解的旧算法。RSA推荐密钥长度至少为2048位;4096位更好。RSA正在变老,在因式分解方面也取得了重大进展。选择其他的算法可能是明智的。在可预见的未来,RSA算法很有可能会变得非常脆弱。所有SSH客户机都支持这种算法。dsa 一种基于整数有限域离散对数难题的旧的数字签名算法。它通常使用1024位的密钥长度。不再推荐原始形式的DSA。(最新版本的 SSH 服务器默认不支持使用DSA算法的密钥,如果需要使用这种加密算法,需要修改配置文件)ecdsa 一种基于椭圆曲线算法的数字签名算法。对于当前的应用程序,这可能是一个很好的算法。只支持三种密钥长度:256、384 和 521 位。我们建议总是使用521位,因为即便使用 512 位长度的密钥,其大小仍然很小,而且可能比长度更小的密钥更安全(即使使用较小长度的密钥也应该是安全的)。现在大多数SSH客户机都支持这种算法。ed25519 这是OpenSSH中添加的一个新算法。客户对这种算法的支持还不是普遍的。因此,不建议在一般的用途中使用这种加密算法。

可以使用 -t 选项指定加密算法,使用 -b 选项指定密钥长度。例如:

$ ssh-keygen -t rsa -b 4096 $ ssh-keygen -t dsa $ ssh-keygen -t ecdsa -b 521 $ ssh-keygen -t ed25519 2.2.2 指定文件名

正常情况下,会提示用户输入要保存密钥的文件的名称和路径。然而,也可以使用 -f 选项进行指定:

$ ssh-keygen -f ~/tatu-key-ecdsa -t ecdsa -b 521 2.3 将公钥复制到服务器

要使用公钥身份验证,公钥必须被拷贝到一个服务器上并安装到 authorized_keys 文件中。可以很方便的使用 ssh-copy-id 工具来完成这一操作:

$ ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host

一旦在服务器上配置了公钥,服务器将允许任何拥有私钥的连接用户登录。在登录过程中,客户机通过对密钥交换进行数字签名来证明拥有私钥。

2.4 将密钥添加到 SSH 代理

ssh-agent 是一个可以保存用户私钥的程序。因此私钥密码只需提供一次。登录到服务器时还可以转发到代理的连接,从而允许服务器上的SSH命令使用运行在用户桌面上的代理。

有关使用和配置SSH代理的更多信息,请参见 SSH-agent 页面。

2.5 生成主机密钥

ssh-keygen 也可用来生成主机密钥。主机密钥存储在 /etc/ssh 目录中。

主机密钥是常规的 SSH 密钥对。每个主机可以为每个算法拥有一个主机密钥。主机密钥几乎总是存储在以下文件中:

/etc/ssh/ssh_host_dsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key

通常在安装 SSH 服务器时自动生成主机密钥。它们可以随时再生。但是,如果主机密钥被更改,客户端可能会对更改的密钥发出警告。当有人试图执行中间人攻击时,更改的密钥也会被报告。因此,不建议用户盲目地接受它们。因此,更改密钥最好使用SSH密钥管理工具,该工具也可以在客户机上更改密钥,或者使用证书。

2.6 使用X.509证书进行主机身份验证

OpenSSH不支持X.509证书。Tectia SSH 确实支持它们。X.509证书在较大的组织中被广泛使用,它可以方便地在一段时间内更改主机密钥,同时避免来自客户机的不必要警告。它们还允许使用严格的主机密钥检查,这意味着如果主机密钥发生了更改,客户机将直接拒绝连接。

2.7 使用OpenSSH的专有证书

OpenSSH有自己的专有证书格式,可以用于签署主机证书或用户证书。对于用户身份验证,由于缺乏高度安全的证书颁发机构,并且无法通过检查服务器来审计谁可以访问服务器,因此我们建议不要使用OpenSSH证书进行用户身份验证。

然而,OpenSSH证书对于服务器身份验证非常有用,可以实现与标准X.509证书类似的好处。但是,他们需要自己的基础设施来颁发证书。有关证书身份验证的更多信息,请参阅 证书身份认证。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3